package com.observer.demo1.impl;

import java.util.ArrayList;
import com.observer.demo1.face.Observer;
import com.observer.demo1.face.Subject;

public class WeatherData implements Subject {

	// 我们加上一个ArrayList来记录观察者，此ArrayList是在构造器中建立的。
	private ArrayList<Observer> observers;
	private float temperature;
	private float humidity;
	private float pressure;

	public WeatherData() {
		observers = new ArrayList<Observer>();
	}

	@Override
	public void registerObserver(Observer o) {
		// TODO Auto-generated method stub
		observers.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		// TODO Auto-generated method stub
		int i = observers.indexOf(o);
		if (i >= 0) {
			observers.remove(i);
		}
	}

	/*
	 * (non-Javadoc) 有趣的地方来了！在这里，我们 把状态告诉每一个观察者。因为 观察者都实现了update()，所以我
	 * 们知道如何通知它们。
	 * 
	 * @see com.observer.face.Subject#notifyObservers()
	 */
	@Override
	public void notifyObservers() {
		// TODO Auto-generated method stub
		for (int i = 0; i < observers.size(); i++) {
			Observer observer = (Observer) observers.get(i);
			observer.update(temperature, humidity, pressure);
		}
	}

	/**
	 * 当从气象站得到更新观测值 时，我们通知观察者。
	 */
	public void measurementsChanged() {
		notifyObservers();
	}

	/**
	 * 我们想要每本书随书赠送一个小型气象站， 但是出版社不肯。所以，和从装置中读取 实际的气象数据相比，我们宁愿利用这个
	 * 方法来测试布告板。或者，为了好玩，你 也可以写代码从网站上抓取观测值。
	 * 
	 * @param temperature
	 * @param humidity
	 * @param pressure
	 */
	public void setMeasurements(float temperature, float humidity,
			float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}

}
